%%%-------------------------------------------------------------------
%%% @author Rain
%%% @doc 帧同步房间相关定义
%%% @end
%%%-------------------------------------------------------------------
-author("Rain").
-ifndef(LS_ROOM_SVR_HRL).
-define(LS_ROOM_SVR_HRL, true).

%%-define(LS_UPDATE_INTERVAL, 50). % 更新的时间戳ms（更新频率）
-define(LS_UPDATE_INTERVAL, elock_step_behaviour:get_elock_step_update_interval()). % 更新的时间戳ms（更新频率）

-define(LS_FRAME_COUNT_PER_SECOND, 1000 div ?LS_UPDATE_INTERVAL). % 每秒有多少帧
-define(LS_SAVE_LS_WORLD_FRAME_COUNT, 60 * ?LS_FRAME_COUNT_PER_SECOND). % 保存的帧数


-record(ls_pos_v3, {
    x = 0,
    y = 0,
    z = 0
}).

-record(ls_pos_v2, {
    x = 0,
    y = 0
}).

-record(ls_rotation, {
    x = 0,
    y = 0,
    z = 0,
    w = 1
}).


-record(ls_frame_buffer, {
    max_frame = 0, % 最大帧号
    snap_shots_maps = #{}, % 二进制快照数据maps #{Frame => UnitIds}
    frame_input = #{}, % 每一帧输入的内容 #{Frame => #{RoleId => #ls_input{}}}
    hashes = #{}, % #{Frame => Hash} 哈希值键值对，取不到默认为0
    capacity = 0 % 容量
}).


-record(ls_fixed_time_counter, {
    start_time = 0, % 开始的时间戳(ms)
    start_frame = 0, % 开始的帧号
    interval = ?LS_UPDATE_INTERVAL % 每一帧的耗时
}).

-record(ls_reply, {
    unit_infos = [], % 单位信息列表 [#ls_unit_info{}]
    frame_inputs = [], % 每一帧输入的内容 [{Frame, #{RoleId => #ls_input{}}} | ...]
    snap_shots = <<>> % 二进制快照数据
    % 比如说 #p_ls_snap_shots{snap_shots = [#p_ls_snap_shot{} |...]}压缩而成的二进制
}).

% 单位信息
-record(ls_unit_info, {
    role_id = 0, % 角色id
    position = #ls_pos_v3{},   % 位置
    rotation = #ls_rotation{}   % 旋转
}).


-record(ls_input, {
    position = #ls_pos_v2{},
    button = 0
}).


-record(ls_room_role, {
    role_id = 0, % 角色id
    is_load_finish = false % 是否加载完成
}).


%% 进程的state
-record(ls_room_state, {
    match_cnt = 0, % 房间匹配的人数
    frame_buffer = #ls_frame_buffer{}, % 帧缓存
    fixed_time_counter = #ls_fixed_time_counter{}, % 时间相关的固定值
    authority_frame = 0, % 权威帧(当前前后端同步的最新帧)
    reply = #ls_reply{}, % 回放存档
    room_roles = [], % [#ls_room_role{} | ...]
    units = [], % 最新帧单位数据 [#ls_unit_info{}|...],
    random_seed = 0 % 随机种子
}).

-endif.